#ifndef SOCKIO_H
#define SOCKIO_H

/**
 * @file sockio.h
 * @brief Biblioteca de entrada e saida de sockets.
 */

enum socktype {
  SOCKET_UDP,
  SOCKET_TCP
};

/**
 * @brief Abre um socket TCP numa outra ponta.
 * @param host Host (IP ou host).
 * @param port Porta, em HBO.
 * @param type Tipo do socket
 * @return id do socket ou negativo se houve erro.
 * @warning O socket ja estara conectado.
 */
int sockopen(const char *host, int port, enum socktype type);

/**
 * @brief Cria uma conexao de escuta
 * @param port porta para listen.
 * @param backlog numero de conexoes em espera.
 * @param type tipo do socket
 * @return id do socket ou negativo se houve erro
 */
int socklisten(int port, int backlog, enum socktype type);

/**
 * @brief Cria uma nova conexao a partir de usuario na escuta.
 * @param id id do socket listener
 * @return ID do novo socket ou negativo em caso de erro
 * @warning Essa funcao eh bloqueante
 */
int sockaccept(int id);

/**
 * @brief Escreve num socket.
 * @param id Id do socket recebido através de sockopen.
 * @param buf Buffer.
 * @param len Tamanho do buffer.
 * @return Bytes enviados ou negativo para erro.
 * @warning A funcao eh nao bloqueante e nao garante
 * a escrita total.
 */
int sockwrite(int id, const char *buf, unsigned int len);

/**
 * @brief Le de um socket.
 * @param id Id do socket a ser lid.
 * @param buf Buffer.
 * @param len Tamanho do buffer.
 * @return Bytes recebidos ou negativo para erro.
 * @warning Funcao nao eh bloqueante e nao garante
 * a leitura de todos os bytes no buffer de entrada.
 */
int sockread(int id, char *buf, unsigned int len);

/**
 * @brief Fecha um socket
 * @param id Id do socket
 */
int sockclose(int id);

#endif